原文发表于 2014-12-20, 我的lofter:http://kimleo.lofter.com/post/46977_4b8e610
今天参加OpenParty Chengdu,跟同参会的人交流了很多,也得到了一些不错的观点,路上与uaZ一起聊天,也思考了很多。
直接说结论:
因为一切编程语言都是DomainSpecific的,那么接下来的趋势可能就是把(编程)语言当成软件产品或者是服务来提供,而同样的,编程语言也就具备了与产品/服务类似的性质:敏捷、用户体验和其它等等。
其实这也是我凭空构造出来的概念罢了。毕竟在前几年的时候就开始兴起Mash-up / Programmable Web等概念,也算是把可编程性和开放API拿出来作为服务,也有一些初始的样子。更甚者,出现了IFTTT这种基于事件触发和分支结构的定制服务,宛然一个基于开放API的图形化DSL了。 这是“服务化”的例证。
另外是今天在OPCD上Mike Tang分享了Rust,一个由Mozilla主导开发的编程语言。整个语言的优点不必多说,Mike特别提到了另外一点,就是作为一个开源项目,Rust也像一个商业级的产品一样被对待,整个开发过程有良好的项目管理机制/流程,不断地迭代、完善,最终会在明年中发布1.0 final版本。 这是“产品化”的例证。
所以我认为,而且根据第一定律也能够这样推出来,编程语言,无论是所谓的General-Purpose还是Domain-Specific,都将会渐渐地呈现这种趋势。一方面,编程语言会更加的注重抽象和可用性,同时也会根据针对的用户群体进行专门的设计;另外一方面,作为“计算”的一个基本要素,编程语言也可以如同其他的一些设施一样,以服务的形式提供。
其实还有一些可以构想的东西。比如,以后的普通应用软件也是作为图形化或者是更高级抽象的DSL存在,而把这些DSL的基本元素组合起来,就可以自动化地完成各种复杂的任务。另外,像MindMap这种简单的东西也可以进行语义化的设计,甚至是直接作为软件原型设计的DSL进行建模。
也许某一天你就会体验到把一个策划书写完之后游戏的第一个Demo就能拿来试玩的感觉了。
然后我们可以分析一下,究竟要如何去设计一个类似的东西。
其实无论什么语言,都必须要有两个基本的能力,才算得上“可用”,首先是抽象,再就是组合。前者会给你提供整个系统中的基本要素和扩展方法,后者则能够利用这些东西去完成复杂的系统功能。 当然DSL不必像GPL那样复杂,但也还是要一些东西(或者可以把他们叫做基本组合子 Combinator?):
- 重复(循环/ 递归) Repeating
- 分支 Branching
- 引用 Reference
一个简单的例子就是正则表达式。Repeating方面来说,有Kleene Closure(* / + / { });也支持Branching;至于Reference,对应的就是Capture / Grouping。
所以这样来看那些过度纠结MV*中的视图逻辑分离的,也是不必要的嘛。至少还是需要有这三个基本组合子在才行。